package com.cq.hd.app.config;

import com.cq.hd.app.context.ApplicationContextHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;

import java.util.concurrent.TimeUnit;

/**
 * @since 2022/04/11
 */
@Slf4j
public class LockUtils {

    /**
     * 获取Redisson客户端实例
     * @return 返回redisson对象
     */
    public static RedissonClient getRedisson() {
        return ApplicationContextHolder.getBean(RedissonClient.class);
    }

    /**
     * 加锁（阻塞）
     * @param key redis key
     * @param leaseSecond 获取锁后，自动释放时间，单位秒
     */
    public static void blockLock(String key, long leaseSecond) {
        getRedisson().getFairLock(key).lock(leaseSecond, TimeUnit.SECONDS);
    }

    /**
     * 加锁
     * @param key redis key
     * @param waitSecond  取不到锁后，等待锁的时间，单位秒
     * @param leaseSecond 获取锁后，自动释放时间，单位秒
     * @return true成功 false失败
     */
    public static boolean tryLock(String key, long waitSecond, long leaseSecond) {
        try {
            RLock rLock = getRedisson().getFairLock(key);
            return rLock.tryLock(waitSecond, leaseSecond, TimeUnit.SECONDS);
        } catch (Exception e) {
            throw new RuntimeException("do tryLock exception", e);
        }
    }

    /**
     * 解锁
     * @param key redis key
     */
    public static void unlock(String key) {
        if(StringUtils.isBlank(key)) {
            return;
        }
        try{
            RLock rLock = getRedisson().getFairLock(key);
            if (rLock != null && rLock.isLocked()) {
                rLock.unlock();
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
    }

}
